package controllers;

import java.util.ArrayList;
import java.util.List;

import models.CalificacionPeriodo;
import models.Estudiante;
import models.Indicador;
import models.IndicadorPeriodo;
import play.db.jpa.Transactional;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;
import services.ColegioSrv;
import services.DAO;
import util.Queries;

public class AcudienteCtrl extends Controller {

	private static long getIdColegio() {
		return Long.parseLong(session("idColegio"));
	}

	private static long getIdAcudiente() {
		return Long.parseLong(session(UserCtrl.ACTOR_ID_KEY));
	}

	@Transactional(readOnly = true)
	public static Result getEstudiantes() {
		List<Estudiante> res = DAO
				.execute(
						"SELECT e FROM Estudiante e WHERE e.idAcudiente = :idAcudiente",
						-1, "idAcudiente", getIdAcudiente());
		return ok(Json.toJson(res));
	}

	@Transactional(readOnly = true)
	public static Result getMateriasGrado(Long idEstudiante) {
		if (!DAO.find(Estudiante.class, idEstudiante).getIdAcudiente()
				.equals(getIdAcudiente()))
			return unauthorized();
		List<Estudiante> res = DAO.execute(Queries.getMateriasEstudiante(), -1,
				"idEstudiante", idEstudiante, "idCalendarioAcademico", ColegioSrv
						.getColegio(getIdColegio())
						.getIdCalendarioAcademicoActual());
		return ok(Json.toJson(res));
	}

	@Transactional(readOnly = true)
	public static Result getCalificacionesPeriodo(Long idEstudiante,
			Long idMateria) {
		if (!DAO.find(Estudiante.class, idEstudiante).getIdAcudiente()
				.equals(getIdAcudiente()))
			return unauthorized();
		List<CalificacionPeriodo> res = DAO
				.execute(
						"SELECT c FROM CalificacionPeriodo c JOIN Periodo cor ON cor.id = c.idPeriodo WHERE c.idEstudiante = :idEstudiante AND cor.calendarioAcademico.id = :idCalendarioAcademico AND c.idMateria =:idMateria",
						-1, "idEstudiante", idEstudiante, "idCalendarioAcademico",
						ColegioSrv.getColegio(getIdColegio())
								.getIdCalendarioAcademicoActual(), "idMateria",
						idMateria);
		return ok(Json.toJson(res));
	}

	@Transactional(readOnly = true)
	public static Result getIndicadoresPeriodo(Long idEstudiante, Long idMateria) {
		if (!DAO.find(Estudiante.class, idEstudiante).getIdAcudiente()
				.equals(getIdAcudiente()))
			return unauthorized();
		List<Object[]> res = DAO
				.execute(
						"SELECT c,i FROM IndicadorPeriodo c JOIN Periodo cor ON cor.id = c.idPeriodo JOIN Indicador i on i.categoria = c.categoriaIndicador AND i.consecutivo = c.consecutivoIndicador WHERE c.idEstudiante = :idEstudiante AND cor.calendarioAcademico.id = :idCalendarioAcademico AND c.idMateria =:idMateria",
						-1, "idEstudiante", idEstudiante, "idMateria",
						idMateria, "idCalendarioAcademico",
						ColegioSrv.getColegio(getIdColegio())
								.getIdCalendarioAcademicoActual());
		List<IndicadorPeriodo> r = new ArrayList<IndicadorPeriodo>();
		for (Object[] oo : res) {
			IndicadorPeriodo i = (IndicadorPeriodo) oo[0];
			i.setIndicador((Indicador) oo[1]);
			r.add(i);
		}

		return ok(Json.toJson(r));
	}
}
